/**
 这是简单的版的打包和压缩 ，文件路径 记得 1. /  有没有这个 （文件夹 /  父类文件夹/）
 								2. entry 是条目  格式 是  文件名（还要检查有没有/)
								3.压缩文件的时候 压缩文件别放在源路径 免得无止境递归

 */
/*
package com.leo.tool;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.OutputStream;
public class 功能_文件打包和解压缩 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//1.压缩文件需要存放的路径，2.源文件的位置
		compression("E:/eclipse-workspace/test/1.zip",new File("E:/eclipse-workspace/test/1/"));
		//1.解压存放的文件夹    2.源压缩文件  
		decompression("E:/eclipse-workspace/test/2/","E:/eclipse-workspace/test/1.zip");
	}
	//打包（打包路径，源文件路径）
	//这个是压缩 （算法没写 ）
	private static void compression(String zipFileName,File targetFile) {
		System.out.println("正在打包...");
		try {
			//打包字节输出流  创建一个打包file的路径 及 out对象 及加 buff
			ZipOutputStream out =new ZipOutputStream(new FileOutputStream(zipFileName));
			BufferedOutputStream bos=new BufferedOutputStream(out);
			//zip输出流 （创建的zip路径） ，要压缩的文件夹，创建的zip路径，buff输出流（创建的zip路径）
			System.out.println("源文件的路径"+targetFile.toString());
			zip(out,targetFile,targetFile.toString()+"/",bos);
			bos.close();
			out.close();
			System.out.println("********************\n打包任务完毕OVER！ 打包路径是："+zipFileName.toString());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	//zip这个是负责打包 写入目条 
	//zout 是写的路径 ，源文件，源文件路径， 加buff的写路径
	private static void zip(ZipOutputStream zOut,File targetFile,String parent,BufferedOutputStream bos) {
		//如果源文件是文件夹
		if(targetFile.isDirectory()) {
			//所有文件进组
			File[] files=targetFile.listFiles();
			//如果文件夹里的文件个数为0
			
			for(File f:files) {
				System.out.println("文件路径"+parent+f.getName());
				if(files.length==0) {
					try {
						//处理空文件夹    name+/是 文件夹的名字
						
						zOut.putNextEntry(new ZipEntry( f.getName()));
						//System.out.println("ZIP"+f.getName());
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();	
					}
				}
				//System.out.println("f:"+f);
				//递归  f是源路径下的文件
				
				//System.out.println("befor zip"+name);
				zip(zOut,f,parent,bos);
			try {				
				System.out.println("添加条目文件名："+f.getName());
				zOut.putNextEntry(new ZipEntry(f.getName()));
				System.out.println("读取字节+buff文件路径"+parent+f.getName());
				InputStream in =new FileInputStream(parent+f.getName());
				BufferedInputStream bis=new BufferedInputStream(in);
				byte[] bytes=new byte[1024];
				int len=-1;
				while((len=bis.read(bytes))!=-1) {
					bos.write(bytes,0,len);
					bos.flush();
				}
				bis.close();
				System.out.println("递归写入完毕！");					
			} catch (IOException e) {
						// TODO Auto-generated catch block
				e.printStackTrace();				
			}
			}
		}						
	}
	//目标文件   base文件夹  name 是到父+/的路径 条目是文件名
	private static void decompression(String targetFileName,String srcpath)  {
		try (ZipInputStream zIn = new ZipInputStream(new FileInputStream(srcpath))) {
			ZipEntry entry=null;
			File file=null;
			
			//System.out.println("zIn:"+zIn.getNextEntry().toString()+"Ff"+res);
			//循环： 条目 下个不为空 和 同批次条目不为文件夹
			while((entry=zIn.getNextEntry())!=null && !entry.isDirectory()) {
				System.out.println("读取条目信息： "+entry.toString());
				//将 父文件夹 和 目条结合 方便后面的字节写入流写入
				file=new File(targetFileName,entry.getName());
				System.out.println("创建文件夹"+file.getAbsolutePath());
				if(!file.exists()) {
					 new File(file.getParent()).mkdirs();
				}
				System.out.println("写入字节+buff(file=target+entry)："+file.getAbsolutePath());
				OutputStream out=new FileOutputStream(file);
				BufferedOutputStream bos=new BufferedOutputStream(out);
				byte[]bytes=new byte[1024];
				int len=-1;
				 
				while((len=zIn.read(bytes))!=-1) {
					bos.write(bytes,0,len);
					 
				}
				bos.close();
				System.out.println("关闭字节写入流\n字节流写入文件完毕"+targetFileName+entry.toString());
				
			}
			
			System.out.println("*******************\n解压任务完毕OVER!文件存放路径："+file.getParent());
		} catch (IOException e) {
					// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
*/